<?php
require_once ('lib/StaticRoute.php');
require_once ('lib/HTTPRequest.php');

class MVCApplication {
	/* Oggetto route
	 * è la rotta selezionata per la gestione della richiesta utente, e contiene 
	 * le regole per determinare il controller atto a servire la richiesta
	 */
	private static $_route;
	 
	/* Oggetto request 
	 * Svolge funzione di wrapper attorno ai parametri $_GET e $_POST
	 * e fornisce metodi d'utilità per operare su questi
	 */
	private static $_request;

	function __construct(){
		// In questa applicazione esiste un solo tipo di rotta, la rotta statica
		// Questa rotta prevede che il controller atto a servire la richiesta viene
		// individuato dalla stringa che segue l'ultimo "/" nella URL
		self::$_route = new StaticRoute($_SERVER['REQUEST_URI']);
		self::$_request = new HTTPRequest();
	}

	/*
	 * void bootstrap (void)
	 * Avvia l'applicazione ("bootstrap")
	 * Tramite ausilio della rotta individua il controller, e
	 * passa ("dispatch") a quest'ultimo il controllo del flusso applicativo.
	 */
	public function bootstrap() {
		$controllerClass = self::$_route->getController();
		// "Naming Conventions"
		// La classe che modella il controller individuato deve seguire le seguenti regole nell'assegnazione del nome:
		// - essere tutta in minuscolo eccetto la prima lettera ed ogni lettera che segue un carattere underscore ("_"), che devono essere in maiuscolo
		// - avere un suffisso "Controller"
		// Il file php che contiene la classe controller individuata, deve:
		// - avere lo stesso nome della classe, con estensione ".php"
		// - trovarsi all'interno della cartella "controller"
		// Esempi:
		// http://localhost/applicazione		 		=> "IndexController"		=> "controller/IndexController.php" 
		// http://localhost/applicazione/pippo			=> "PippoController"		=> "controller/PippoController.php"
		// http://localhost/applicazione/pippo_pluto	=> "Pippo_PlutoController"	=> "controller/Pippo_PlutoController.php" 
		$controllerClass = (empty($controllerClass)  ? 'Index' : str_replace('_ ','_',ucwords(str_replace('_','_ ', strtolower($controllerClass))))) . 'Controller';
		if (!file_exists(APP_DIR . '/controller/' . $controllerClass . ".php")) {
			$controllerClass = "ErrorController";
		}
		require_once('controller/' . $controllerClass . ".php");
		$controller = new $controllerClass();
		$controller->dispatch();
	}
	
	/*
	 * StaticRoute getRoute ( void )
	 * Ritorna l'oggetto rotta
	 */
	public static function getRoute() {
		return self::$_route;
	}
	
	/* HTTPRequest getRequest ( void )
	 * Ritorna l'oggetto HTTPRequest
	 */
	public static function getRequest() {
		return self::$_request;
	}
	
}
?>
